In many computing environments, application containers, and/or virtual machines (VMs), program code running in the environment is typically not native code and usually requires an interpreter to execute native code. Native code/applications are code/applications that are specific to a hardware and/or operating system platform implemented by a computing system. For example, Java Virtual Machine (JVM) acts as an interpreter to convert Bytecodes to native code of the hosting operating system. Such computing environments typically use a Just-in-Time (JIT) compiler, which is a compiler that operates during execution of a program (i.e., runtime) rather than prior to execution. For example, JVM JIT compiler compiles bytecode into native machine code at runtime for direct execution on the hardware. However, conventional JIT compilation requires additional computing resources (e.g., processor time and memory usage), which significantly hinders system performance.
JVM implementations include a solution to the aforementioned complication in that the JVM JIT compiler monitors the sequences of bytecode that are frequently executed and translates the frequently executed bytecode into native machine code. The JIT compilation used by such systems may be used to run frequently used code at relatively high speed after an initial phase of slow interpretation. One complication with this approach is that JVM JIT compilation still requires a relatively large number of executions of the interpreted code after application startup/initialization before compiling bytecodes into native code, which significantly affects the startup time. Additionally, the initial phase of slow interpretation occurs each time the application or system is restarted because the frequently executed bytecode is no longer available when the application or system is restarted.